/**
 * ClassName: Singleton
 * Package: PACKAGE_NAME
 *
 * @Author 马学兴
 * @Create 2025-02-12 14:35
 * @Version 1.0
 * Description:
 */
public class Singleton {
    // 使用 volatile 关键字修饰实例变量，防止指令重排序和确保内存可见性
    private static volatile Singleton instance;

    // 私有化构造函数，防止外部通过 new 关键字创建实例
    private Singleton() {}

    // 提供一个公共的静态方法来获取单例实例
    public static Singleton getInstance() {
        // 第一次检查：非同步检查，减少同步的开销
        // 如果 instance 不为 null，说明实例已经被初始化，直接返回
        if (instance == null) {
            // 同步代码块：对 Singleton 类进行同步，确保线程安全
            // 同步的范围是 Singleton 类本身，确保只有一个线程可以进入
            synchronized (Singleton.class) {
                // 第二次检查：在同步代码块内再次检查 instance 是否为 null
                // 这是因为可能有多个线程同时通过第一次检查，但只有一个线程能进入同步代码块
                if (instance == null) {
                    // 初始化实例
                    instance = new Singleton();
                }
            }
        }
        // 返回单例实例
        return instance;
    }
}